/**
 * @(#)AdministradorConfiguracionFactory.java 19/11/2010
 *
 * Copyright (c) 2007-2012 PsiqueWare S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information of PsiqueWare S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : AngelElectrico
 * <br/>Creaci&oacute;n: 19/11/2010 - 09:39:26 AM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>19/11/2010 | <a href = "mailto:AngelElectrico@PsiqueWare.com">&Aacute;ngel El&eacute;ctrico</a> | Creaci&oacute;n del Objeto.</li>
 *
 * </ul>
 */

package com.psiqueware.alheli.configuracion;

import com.psiqueware.alheli.configuracion.basedatos.AdministradorConfiguracionBaseDatos;
import com.psiqueware.alheli.configuracion.basedatos.AdministradorConfiguracionBaseDatosEnlace;
import com.psiqueware.alheli.configuracion.dummy.AdministradorConfiguracionDummy;
import com.psiqueware.alheli.configuracion.memoria.AdministradorConfiguracionMemoria;
import com.psiqueware.alheli.configuracion.properties.AdministradorConfiguracionProperties;
import com.psiqueware.alheli.configuracion.properties.AdministradorConfiguracionPropertiesOrdenadas;
import com.psiqueware.alheli.dao.EnlaceTransaccional;
import com.psiqueware.alheli.dao.TipoDAO;

import java.io.File;

/**
 * F&aacute;brica de {@link AdministradorConfiguracion}.
 * <br/>Paquete Original: com.psiqueware.alheli.configuracion
 * <br/>Nombre  Original: AdministradorConfiguracionFactory
 * <br/>Oprima para ver : <a href="AdministradorConfiguracionFactory.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">AngelElectrico</a>
 * @version Revision: 1.1 19/11/2010 09:39:26 AM
 * @noinspection UnusedDeclaration
 */
public final class AdministradorConfiguracionFactory
{


    /**
     * Constructor de AdministradorConfiguracionFactory.
     */
    public AdministradorConfiguracionFactory()
    {

    }

    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que persiste
     * los valores en memoria.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionMemoria()
    {
        return new AdministradorConfiguracionMemoria();
    }


    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que no persiste
     * los valores.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionDummy()
    {
        return new AdministradorConfiguracionDummy();
    }

    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que persiste
     * los valores en un archivo en el formato de Java Properties.
     *
     * @param archivoProperties {@link File} donde se van a almacenar las propiedades.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionProperties(final File archivoProperties)
    {
        return new AdministradorConfiguracionProperties(archivoProperties);
    }

    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que persiste
     * los valores en un archivo en el formato de Java Properties ordenadas alfab&eacute;ticamente.
     *
     * @param archivoProperties {@link File} donde se van a almacenar las propiedades.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionPropertiesOrdenadas(final File archivoProperties)
    {
        return new AdministradorConfiguracionPropertiesOrdenadas(archivoProperties);
    }

    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que persiste
     * los valores en base de datos.
     *
     * @param tipoDAO para crear los DAOs internos en base al tipo.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionBaseDatos(final TipoDAO tipoDAO)
    {
        return new AdministradorConfiguracionBaseDatos(tipoDAO);
    }

    /**
     * Devuelve una instancia del {@link AdministradorConfiguracion} que persiste
     * los valores en base de datos.  <br/><br/> <b>Importante:</b> El {@link AdministradorConfiguracion} devuelto almacena
     * el {@link EnlaceTransaccional} en la instancia, por lo que se necesita un nuevo {@link AdministradorConfiguracion}
     * cada vez que se pretenda realizar una transacci&oacute;n. Una soluci&oacute;n mas permanente la brinda el m&eacute;todo
     * this#getAdministradorConfiguracionBaseDatos(tipoDAO:TipoDAO).
     *
     * @param enlaceTransaccional en el que se esta realizando la transacci&oacute;n.
     *
     * @return un {@link AdministradorConfiguracion} instanciado siempre.
     */
    public static AdministradorConfiguracion getAdministradorConfiguracionBaseDatos(final EnlaceTransaccional enlaceTransaccional)
    {
        return new AdministradorConfiguracionBaseDatosEnlace(enlaceTransaccional);
    }
}

